<?php

declare (strict_types=1);

if (!function_exists('object_2_array')) {
    /**
     *  对象转数组
     *  @param object $object
     *  @return array
     */
    function object_2_array(object $object): array
    {
        $result = json_decode(json_encode($object), true);
        
        return $result;
    }
}

/**
 *  全局帮助函数
 */

if (!function_exists('microtime_str')) {
    /**
     *  获取可视化毫秒时间
     *  @param ?integer $length 毫秒保留位数
     *  @return string
     */
    function microtime_str(int $length = 4): string
    {
        $microtime = microtime(true);

        $microtime_array = explode('.', (string)$microtime);

        return date('Y-m-d H:i:s', (int)$microtime_array[0]) . ' - ' . str_pad($microtime_array[1], $length, '0', STR_PAD_RIGHT);
    }
}

if (!function_exists('mk_dirs')) {
    /**
     *  当目录不存在新建目录
     *  @param string $dir 目录路径
     *  @return boolean
     */
    function mk_dirs(string $dir): bool
    {
        if (!is_dir($dir)) {
            if (!mk_dirs(dirname($dir))) {
                return false;
            }

            if (!mkdir($dir, 0777)) {
                return false;
            }
        }

        return true;
    }
}

if (!function_exists('array_to_tree')) {
    /**
     *  将指定格式数组转为数结构
     *  @param array  $array
     *  @param ?string $pk 主键名
     *  @param ?string $p_pk 关联主键名
     *  @return array
     */
    function array_to_tree(array $array, string $id = 'id', $pid = 'pid') {
        if (empty($array)) return $array;
    
        $items = [];
        foreach ($array as $item) {
            if (!array_key_exists($id, $item)) throw new \Exception('数组格式错误');

            $items[$item[$id]] = $item;
        }
    
        $tree = [];
        foreach ($items as $key => $item) {
            if (!array_key_exists($pid, $item)) throw new \Exception('数组格式错误');
            $parent_id = $item[$pid];

            if (array_key_exists($parent_id, $items)) {
                $items[$parent_id]['children'][] = &$item[$key];
            } else {
                $tree[] = &$item[$key];
            }
        }
    
        return $tree;
    }
}
